﻿#pragma once
//#define _CRT_SECURE_NO_WARNINGS
//#include <stdio.h>
//#include <stdlib.h>
//#include <assert.h>
//#include <string.h>
#include "common.h"


typedef int double_node_type;

typedef struct DoubleListNode {
    double_node_type data;
    struct DoubleNode* next;
    struct DoubleNode* prev;
} double_node;

extern double_node* create_double_node(double_node_type n); // 创建双向链表节点
extern void printf_double_list(double_node* head); // 打印双向链表
extern void add_head_double_node(double_node** head,
    double_node_type n);  // 头插法插入双向链表节点
extern void del_head_double_node(double_node** head); // 删除头节点
extern void add_end_double_node(double_node** head,
    double_node_type n); // 尾插法插入双向链表节点
extern void del_end_double_node(double_node** head); // 删除尾节点
extern size_t get_double_list_len(double_node* head); // 获取双向链表长度
extern void insert_double_node(double_node** head,
    size_t index, double_node_type n); // 插入指定位置的节点
extern void del_double_node(double_node** head, size_t index); // 删除指定位置的节点
extern int del_num_double_list(double_node** head, double_node_type num);// 删除指定数值的节点
extern void reverse_double_list1(double_node** head); // 翻转双向链表，迭代法
extern double_node* reverse_double_list2(double_node* head); // 翻转双向链表，递归法
extern int search_num_double_list(double_node* head,
    double_node_type num); // 查找双向链表中是否存在指定数值
extern double_node* dli1_add_dli2(double_node* head1, double_node* head2); // 两个双向链表相加
extern void print_front_and_end(double_node* head); // 打印双向链表的前后节点数据
extern void insertion_sort_doubly_linke(double_node* head); // 排序双向链表
extern double_node* last_node(double_node* head); // 获取双向链表的最后一个节点
extern void quick_sort_doubly_linked(double_node* head); // 快速排序双向链表

extern void destroy_double_list(double_node* head); // 翻转双向链表，递归法